#ifndef __BSP_FLASH_H_
#define __BSP_FLASH_H_

#include "main.h"
#include "stdint.h"
#include "stdio.h"
#include "string.h"

/* Base address of the Flash sectors Bank 1 */
#define BSP_ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes */

/* Base address of the Flash sectors Bank 2 */
#define BSP_ADDR_FLASH_SECTOR_12     ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_13     ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_14     ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_15     ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_16     ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_17     ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_18     ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_19     ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_20     ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes  */
#define BSP_ADDR_FLASH_SECTOR_21     ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes  */
#define BSP_ADDR_FLASH_SECTOR_22     ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */
#define BSP_ADDR_FLASH_SECTOR_23     ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes */


/* base and end of the Flash address */
#define BSP_USER_FLASH_BASE_ADDRESS       ((uint32_t)0x08000000)
#define BSP_USER_FLASH_END_ADDRESS        ((uint32_t)0x081FFFFF)


#define BSP_FLASH_WAITETIME             50000U      /* flash wait timeout */
#define BSP_FLASH_DATA_BUF_SIZE         64          /*flash size 64 kb*/

typedef enum _bsp_flash_status{

    BSP_FLASH_WRITE_OK = 0,           /*!< write flash is ok */
	BSP_FLASH_WRITE_ERR,              /*!< write flash is error */
    BSP_FLASH_READ_OK,                /*!< read flash is ok */
	BSP_FLASH_READ_ERR,               /*!< read flash is error */
	BSP_FLASH_ERASE_SECTOR_OK,        /*!< erase flash sector is ok */
	BSP_FLASH_ERASE_SECTOR_ERR,       /*!< erase flash sector is error */
	BSP_FLASH_ADDRESS_ERR

}bsp_flash_status;

typedef enum _data_remainder {
	
	REM_0 = 0,                            /*!< the remainder is 0 */
	REM_1,                                /*!< the remainder is 1 */
	REM_2,                                /*!< the remainder is 2 */
	REM_3	                              /*!< the remainder is 3 */
}data_remainder_t;


bsp_flash_status bsp_flash_erase_sector(uint8_t sector);
uint8_t bsp_flash_get_sector(uint32_t address);

bsp_flash_status bsp_flash_write_data(uint32_t write_addrs, void *pbuffer, uint16_t data_len);
void bsp_flash_read_data(uint32_t read_addrs, void *pbuffer, uint16_t data_len);

void bsp_flash_task(void);
void bsp_flash_read_task(void);

#endif

